package com.itheima.lj.base;

import android.app.Fragment;
import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.Nullable;

import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import com.itheima.lj.R;
import com.itheima.lj.base.BaseListAdapter;
import com.itheima.lj.net.OSChinaApi;
import com.loopj.android.http.AsyncHttpResponseHandler;

import org.apache.http.Header;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

/**
 * 界面框架搭建之带刷新的列表界面(必须包含SwipeRefreshLayout+RecyclerView控件)实现步骤：
 * 1. 设置xml布局文件，配置布局文件给界面，加载布局(SwipeRefreshLayout+RecyclerView)  ： 公共方法
 * 2. 查找引用关心的控件、初始化控件  ：公共方法
 * 3. 对SwipeRefreshLayout设置下拉刷新监听  ：公共方法
 * 4. 给RecyclerView添加条目点击事件,滚动监听 ：公共方法
 * 5. 创建数据适配器  ：特殊方法
 * 6. 给RecyclerView设置数据适配器 ：公共方法
 * 7. 发起网络请求数据 ：特殊方法
 * 8. 将请求到的数据解析 (InputSteam, byte[], String) -> (Gson,xStream) -> Bean转换List<News>  ：特殊方法
 * 9. 展示数据到界面上(更新数据适配器) ：公共方法
 */
public abstract class BaseListFragment<T> extends Fragment implements  SwipeRefreshLayout.OnRefreshListener {
    @BindView(R.id.rv_news)
    protected RecyclerView mRecylerView;
    @BindView(R.id.swipe_refresh_layout)
    protected  SwipeRefreshLayout mSwipeRefreshLayout;
    private BaseListAdapter mAdapter;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        /***************************与UI相关的操作**************************/
        //1.  设置xml布局文件，配置布局文件给界面，加载布局(SwipeRefreshLayout+RecyclerView)
        View view = View.inflate(getActivity(),getLayoutId(), null);
        //2. 查找引用关心的控件、初始化控件
        ButterKnife.bind(this, view);
        //2.1 SwipeRefreshLayout 初始化
        //初始化SwipeRefreshLayout 颜色 及 刷新监听
        mSwipeRefreshLayout.setColorSchemeColors(Color.parseColor("#ff0000"),
                Color.parseColor("#00ff00"), Color.parseColor("#0000ff"),
                Color.parseColor("#ffff00"));
        //2.2 对RecyclerView初始化
        //设置线性的布局方式
        LinearLayoutManager linearLayoutManager=new LinearLayoutManager(getActivity());
        linearLayoutManager.setOrientation(RecyclerView.VERTICAL);
        mRecylerView.setLayoutManager(linearLayoutManager);

        //3. 对SwipeRefreshLayout设置下拉刷新监听
        mSwipeRefreshLayout.setOnRefreshListener(this);

        //4. 给RecyclerView添加条目点击事件,滚动监听
        mRecylerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
            }
        });
        //5. 创建RecyclerView数据适配器
        mAdapter = getListAdapter();
        //6. 给RecyclerView设置数据适配器
        mRecylerView.setAdapter(mAdapter);

        /***********************与数据相关的操作*********************/
        //7.发起网络请求数据
        sendRequestData();
        return view;
    }

    /**取得界面布局的资源id
     * 钩子方法，把子类的实现方法钩出来，子类可以重写该方法，设置子类特有的界面
     * 约定 ：布局中必须包含(SwipeRefreshLayout+RecyclerView)，且命名一致
     * 使用场景： 在模板设计模式中常使用
     */
    public int getLayoutId(){
        return  R.layout.fragment_base_list;
    }

    // 创建自定义的服务端接口回调对象
    protected OSChinaApi.ResultRefresh listener =new OSChinaApi.ResultRefresh() {
        @Override
        public void onSuccess(byte[] datas) {
            //8. 将请求到的数据解析 (InputSteam, byte[], String) -> (Gson,xStream) -> Bean转换List<News> 
            final List<T> list=parseList(datas);
            //9. 展示数据到界面上(更新数据适配器)
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    //通过适配器展示列表数据
                    mAdapter.addDatas(list);
                }
            });
        }
        @Override
        public void onFailure(String errorMsg) {
        }
    };
    //创建第三方框架提供的服务端接口回调对象
    protected AsyncHttpResponseHandler handler=new AsyncHttpResponseHandler() {
        //成功则回调，该方法在UI线程运行
        @Override
        public void onSuccess(int i, Header[] headers, byte[] bytes) {
            //8. 将请求到的数据解析 (InputSteam, byte[], String) -> (Gson,xStream) -> Bean转换List<News> 
            final List<T> list=parseList(bytes);
            //9. 展示数据到界面上(更新数据适配器)
            mAdapter.addDatas(list);
        }
       //失败则回调
        @Override
        public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) {

        }
    };







    //5. 由于父类不能决定子类的列表适配器（条目布局及要装配的数据），所以抽象出去，由子类去实现
    public abstract BaseListAdapter getListAdapter() ;
    //7. 请求服务端数据，由于父类不能决定子类如何访问服务端(比如：url)，所以抽象出去，由子类去实现
    public abstract void sendRequestData();
    //8.解析xml数据,由于父类不能决定子类如何解析数据，所以抽象出去，由子类去实现
    public abstract  List<T> parseList(byte[] datas);

    //SwipeRefreshLayout 刷新回调的方法
    @Override
    public void onRefresh() {
        Toast.makeText(getActivity(), "下拉刷新", Toast.LENGTH_SHORT).show();
    }
}
